package com.mahiru.mahiruaiagent.agent;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.ai.tool.ToolCallback;
import org.springframework.ai.tool.ToolCallbackProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @Author Enkidu
 * @Date 2025/7/9 16:33
 */
@Component
public class MahiruManus extends ToolCallAgent {
    public MahiruManus(@Autowired ToolCallback[] allTools,
                       @Autowired ChatModel dashscopeChatModel,
                       @Autowired ToolCallbackProvider toolCallbackProvider) {
        // 将MCP工具提供者作为一个单独的工具传递
        super(allTools);
        this.setName("Mahiru Manus");
        String SYSTEM_PROMPT = """
                你是Mahiru Manus，一个全能AI助手，旨在解决用户提出的任何任务。
                你拥有各种工具可以调用，以高效完成复杂请求。

                工具选择指南：
                1. 对于地理位置相关查询（如附近景点、路线规划等），优先使用高德地图的MCP服务而非网络搜索
                2. 下载图片时，必须使用专门的downloadImage工具而非通用下载工具
                3. 生成PDF时，确保所有图片资源都是有效的图片文件
                4. 处理资源时要验证资源类型的正确性

                始终遵循以下工作流程：
                1. 仔细分析用户需求，确定需要使用的工具
                2. 对于复杂任务，将其分解为多个步骤
                3. 每完成一个步骤，清晰解释结果并建议下一步操作
                """;
        this.setSystemPrompt(SYSTEM_PROMPT);
        String NEXT_STEP_PROMPT = """
                基于用户需求，主动选择最合适的工具或工具组合。
                对于复杂任务，将问题分解并逐步使用不同工具解决。

                工具选择优先级：
                - 地理位置查询：优先使用高德地图API相关工具
                - 图片下载：使用downloadImage工具而非通用downloadResource工具
                - 文件生成：确保所有输入资源的格式正确

                使用每个工具后，清晰解释执行结果并建议下一步。
                如果想在任何时候停止交互，请使用`doTerminate`工具/函数调用。
                """;
        this.setNextStepPrompt(NEXT_STEP_PROMPT);
        this.setMaxSteps(20);

        // 初始化客户端，添加MCP工具提供者
        ChatClient chatClient = ChatClient.builder(dashscopeChatModel)
                // .defaultAdvisors(new MyLoggerAdvisor())
                // 将MCP工具提供者作为默认工具添加
                .defaultTools(toolCallbackProvider)
                .build();
        this.setChatClient(chatClient);
    }
}
